home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 7
/
FM Towns Free Software Collection 7.iso
/
ms_dos
/
disp
/
disp.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-11-30
|
9KB
|
388 lines
/*
* Dipsray Speed Checker ver 1.0 1993/05/03
*
* ----- 目的
* コンソールの表示速度を計測する実験用programです
* あなたの環境での表示速度を教えて下さい
*
* パラメーターで指定した表示ルーチン(複数指定可)を使用して画面表示を行い
* その実行時間を表示します。
*
* ----- 使用方法 : usage()も参照して下さい
* MS-DOSの標準入力に表示原稿となるファイルをリダイレクトで指定して下さい。
* これを忘れた場合コンソールが直結されるので注意して下さい。
* その場合はctrl-z + cr で終了できます。
* 計測値はファイルに書き出されますので'-o'で指定して記録して下さい。
* その結果に実行環境を書き添えて頂ければ幸いです。
*
* 実行環境とは実行時の機種・CPU・システムクロック・メモリウェイト
* CPUキャッシュ制御状態・DOSコンソール名(DOS3.1/T-OS2.1L20/ERICON等)です。
*
* 通信作業時の負荷を調べることができます。この場合通信ポートをループバック
* モードに設定します。表示原稿はいったんシリアルポートから送信され、そこで
* ループバックして再び受信されます。このための回線ドライバとしてsiamを利用
* しますので事前にsiamの常駐をすることと、事後に常駐を解除(siam /r)する
* ことを忘れないで下さい。
*
* 推奨する作業手順をバッチファイルにして同梱します。(FMRの場合)
* TMENUからコンソールを選び
* autodisp kiroku.doc genkou.doc
* を実行して下さい。
* 生成されたkiroku.docに実行環境をお手持ちのエディタで書き添えて下さい。
*
* おてすきでしたらこれを実行環境を変えながら繰り返してみてください。
* 標準的な386Townの場合、添付原稿を用いると一行程に3分かかります。
* 標準的な486Townの場合は2分かかります。
*
* ----- 注意事項
* 486TOWNSの場合は486対応siamを利用して下さい
* 386FM用siamはsiamfm14.lzhに
* mais(DOS汎用)はsiamset1/lzhに入っていますが
* 一応同梱しておきます。
*
* なお使用CPUが低速である場合はメーカーの予告どおり
* 高速通信時に文字抜けが発生しますが気がついたら教えて下さい。
*
* ----- 互換性
* BIOSと書いている表示ルーチンを使う場合はFMR-BIOS依存です。
* siamはその機種用のsaimが存在すれば利用できます。
* その点に注意すればDOS汎用で動作します。
*
*/
#include <dos.h>
#include <stdio.h>
#include "siam.h"
void
usage()
{
fputs("Usage: disp -[2|9|h|c|b|s|?] { -o ostream } < istream \n" , stderr ) ;
fputs("version 1.0 1993/05/03 Must be in SHIBUYA\n" , stderr ) ;
fputs(" ?: <<<文字表示速度計測programです>>>\n" , stderr ) ;
fputs(" 2: int21h func 2 Display Character\n" , stderr ) ;
fputs(" 9: int21h func 9 Display String\n" , stderr ) ;
fputs(" h: int29h 非公開MS-DOS高速コンソール出力\n" , stderr ) ;
fputs(" c: FMR BIOS int91h ah=1d コンソール一文字出力\n" , stderr ) ;
fputs(" b: FMR BIOS int91h ah=1e コンソール文字列出力\n" , stderr ) ;
fputs(" s: siamを経由して表示します(未実装)\n" , stderr ) ;
fputs(" o: 後続のパラメータostreamとして指定する\n" , stderr ) ;
fputs(" ostream: 計測結果記録ファイル名\n" , stderr );
fputs(" istream: 表示用原稿名(MS-DOSリダイレクトで指定)\n" , stderr ) ;
fputs(" ↑指定を忘れたらctrl-z,crで終了☆\n" , stderr );
}
char t[600];
FILE *f ;
void do2() ;
void do9() ;
void doh() ;
void doc() ;
void dob() ;
void illegal() ;
void nopara() ;
unsigned long tim() ;
void setup( FILE* in ) ;
char* lineinput( char* in ) ;
int
main( int argc , char* argv[] )
{
int i ;
char *p ;
union REGS r ;
union {
long c ;
struct {
unsigned int21_CH : 1 ;
unsigned int21_S : 1 ;
unsigned int29h : 1 ;
unsigned bios_CH : 1 ;
unsigned bios_S : 1 ;
unsigned help : 1 ;
unsigned illegal : 1 ;
unsigned ostream : 1 ;
unsigned ferror : 1 ;
unsigned usesiam : 1 ;
} b ;
} cmdmap ;
cmdmap.c = 0 ;
f = NULL ;
/* --------------------
* パラメータリスト解析
*/
for( i=1 ; i < argc ; i++ ) {
if( argc < 2 ) break ;
p = argv[i] ;
/* -o option が指定された次のパラメータリストは出力パス名 */
if( cmdmap.b.ostream ) {
if( ! ( f = fopen( p , "a" ) ) ) {
cmdmap.b.ferror = 1 ; break ; }
cmdmap.b.ostream = 0 ;
continue ;
}
/* パラメータスイッチを使うなら'/' or '-'を要求する */
/* じつはなくても構わない */
if( *p != '/' && *p !='-' ) --p ;
while( *(++p) ) {
switch( *p ) {
case '2' : cmdmap.b.int21_CH = 1 ; break ;
case '9' : cmdmap.b.int21_S = 1 ; break ;
case 'h' : cmdmap.b.int29h = 1 ; break ;
case 'c' : cmdmap.b.bios_CH = 1 ; break ;
case 'b' : cmdmap.b.bios_S = 1 ; break ;
case '?' : cmdmap.b.help = 1 ; break ;
case 'o' : cmdmap.b.ostream = 1 ; break ;
case 's' : cmdmap.b.usesiam = 1 ; break ;
default : cmdmap.b.illegal = 1 ; break ;
}
}
}
/* ---------------------------------
* パラメータエラー・初期化不良の検出
*/
if( cmdmap.b.ostream ) {
fputs("記録用ファイル名も指定して下さい。\n", stderr ) ;
return 5 ;
}
if( cmdmap.b.ferror ) {
fprintf(stderr, "記録ファイル %s はエラーのため使用できません" , p ) ;
return 4 ;
}
if( cmdmap.b.usesiam ) {
/* siam常駐チェック */
for( i = 0 ; i < MAX_PORT ; i++ ) {
r.x.ax = MAGIC_NO ;
r.h.bh = i ;
r.h.bl = FN_NO_SIAM ;
int86( 0x2f , &r , &r ) ;
if( r.x.bx == MAGIC_NO2 ) break ;
else r.x.ax = 0 ;
}
fp_siam = (funcptr far *)( (unsigned long) r.x.ax << 16);
}
if( cmdmap.b.illegal ) {
fprintf(stderr, "i?29hcb : %1d%1d%1d%1d%1d%1d%1d\n" ,
cmdmap.b.illegal ,cmdmap.b.help ,cmdmap.b.int21_CH ,
cmdmap.b.int21_S ,cmdmap.b.int29h ,cmdmap.b.bios_CH ,
cmdmap.b.bios_S ) ;
illegal() ;
return 2 ;
}
/* ----
* 分岐
*/
if( cmdmap.b.help ) usage() ;
if( cmdmap.b.int21_CH ) do2() ;
if( cmdmap.b.int21_S ) do9() ;
if( cmdmap.b.int29h ) doh() ;
if( cmdmap.b.bios_CH ) doc() ;
if( cmdmap.b.bios_S ) dob() ;
if( cmdmap.c == 0 ) { nopara() ; return 3 ; } ;
return 0 ;
}
void
do2() /* ----- int 21h func 2 : スクリーン文字出力 ----- */
{
int c ;
char *p ;
union REGS r ;
unsigned long ti ;
setup( stdin ) ;
ti = tim() ;
while( p = lineinput( t ) ) {
while ( *p != '$' ) {
r.h.ah = 2 ;
r.h.dl = *p++ ;
intdos( &r , &r ) ;
}
r.h.ah = 2 ;
r.h.dl = 0x0d ;
intdos( &r , &r ) ;
r.h.ah = 2 ;
r.h.dl = 0x0a ;
intdos( &r , &r ) ;
}
ti = tim() - ti ;
if( f ) fprintf(f,"2:%5lu0ms\n", ti ) ;
printf( "2:%5lu0ms\n", ti ) ;
}
void
do9() /* ----- int 21h func 9 : スクリーン文字列出力 ----- */
{
int c ;
char far *p;
union REGS r ;
struct SREGS s ;
unsigned long ti ;
setup( stdin ) ;
ti = tim() ;
while( p = lineinput( t ) , !feof(stdin) && !ferror(stdin) ) {
r.h.ah = 9 ;
r.x.dx = FP_OFF( p ) ;
s.ds = FP_SEG( p ) ;
intdosx( &r , &r , &s ) ;
r.h.ah = 2 ;
r.h.dl = 0x0d ;
intdos( &r , &r ) ;
r.h.ah = 2 ;
r.h.dl = 0x0a ;
intdos( &r , &r ) ;
}
ti = tim() - ti ;
if( f ) fprintf(f,"9:%5lu0ms\n", ti ) ;
printf( "9:%5lu0ms\n", ti ) ;
}
void
doh() /* ----- int 29h : 通称高速コンソール出力(ctrl-c無効) ----- */
{
int c ;
char *p ;
union REGS r ;
unsigned long ti ;
setup( stdin ) ;
ti = tim() ;
p = t ;
while( p = lineinput( t ) ) {
while ( *p != '$' ) {
r.h.al = *p++ ;
int86( 0x29 , &r , &r ) ;
}
r.h.al = 0x0d ;
int86( 0x29 ,&r , &r ) ;
r.h.al = 0x0a ;
int86( 0x29 ,&r , &r ) ;
}
ti = tim() - ti ;
if( f ) fprintf(f,"h:%5lu0ms\n", ti ) ;
printf( "h:%5lu0ms\n", ti ) ;
}
void
doc() /* ----- FMR BIOS int 91h func 1d : 一文字表示 ----- */
{
int c ;
char* p;
union REGS r ;
unsigned long ti ;
setup( stdin ) ;
ti = tim() ;
p = t ;
while( p = lineinput( t ) ) {
while ( *p != '$' ) {
r.h.ah = 0x1d ;
r.h.al = *p++ ;
int86( 0x91 , &r , &r ) ;
}
r.h.ah = 0x1d ;
r.h.al = 0x0d ;
int86( 0x91 , &r , &r ) ;
r.h.ah = 0x1d ;
r.h.al = 0x0a ;
int86( 0x91 , &r , &r ) ;
}
ti = tim() -ti ;
if( f ) fprintf(f,"c:%5lu0ms\n", ti ) ;
printf( "c:%5lu0ms\n", ti ) ;
}
void
dob() /* ----- FMR BIOS int 91h func 1e : 文字列表示 ----- */
{
int c ;
char far *p;
union REGS r ;
struct SREGS s ;
unsigned long ti ;
setup( stdin ) ;
ti = tim() ;
p = t ;
while( p = lineinput( t ) , !feof(stdin) && !ferror(stdin) ) {
r.h.ah = 0x1e ;
r.x.cx = 79 ;
r.x.di = FP_OFF( p ) ;
s.ds = FP_SEG( p ) ;
int86x( 0x91 , &r , &r , &s ) ;
r.h.ah = 0x1d ;
r.h.al = 0x0d ;
int86( 0x91 , &r , &r ) ;
r.h.ah = 0x1d ;
r.h.al = 0x0a ;
int86( 0x91 , &r , &r ) ;
}
ti = tim() - ti ;
if( f ) fprintf(f,"b:%5lu0ms\n", ti ) ;
printf( "b:%5lu0ms\n", ti ) ;
}
void
illegal()
{
fputs("Illegal parameter exists. Operation is canceld.\n" , stderr ) ;
usage() ;
}
void
nopara()
{
fputs("Please check parameters.\n" , stderr ) ;
usage() ;
}
unsigned long
tim() /* ----- DOS(int21h/func2ch)を利用した時計チェック ----- */
/* FMR の場合は精度が10ms単位です */
{
union REGS r ;
r.h.ah = 0x2c ;
intdos( &r , &r ) ;
return ((((r.h.ch * 60 ) + r.h.cl ) * 60 ) + r.h.dh ) * 100 + r.h.dl ;
}
void
setup( FILE* in )
{
rewind( in) ;
}
char*
lineinput( char* in )
{
return gets( in ) ;
}